﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EntitiesLayer;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace StubDataAccessLayer
{
    public class DalManager
    {
        #region Properties

        public ObservableCollection<Joueur> Players
        {
            get;
            private set;
        }

        public ObservableCollection<Reservation> Reservations
        {
            get;
            private set;
        }

        public ObservableCollection<Equipe> Teams
        {
            get;
            private set;
        }

        public ObservableCollection<Coupe> Cups
        {
            get;
            private set;
        }

        public ObservableCollection<Stade> Stadiums
        {
            get;
            private set;
        }

        public ObservableCollection<Match> Matches
        {
            get;
            private set;
        }

        public ObservableCollection<Spectateur> Spectateurs
        {
            get;
            private set;
        }

        #endregion

        private static DalManager instance = null;

        /// <summary>
        /// Constructeur. Création des différentes ObservableCollectiones
        /// </summary>
        private DalManager() 
        {
            Players = returnAllJoueurs();
            Teams = returnAllEquipes();
            Cups = returnAllCoupes();
            Stadiums = returnAllStades();
            Matches = returnAllMatches();
            Reservations = returnAllReservations();
            Spectateurs = returnAllSpectateurs();
        }
        

        #region Compo Equipe

        private ObservableCollection<Joueur> joueurASM()
        {
            ObservableCollection<Joueur> ObservableCollectionJoueur = new ObservableCollection<Joueur>();
            ObservableCollectionJoueur.Add(new Joueur(42, PosteJoueur.GARDIEN, 10, new DateTime(1990, 10, 10), "Lee", "Byrne", 2));
            ObservableCollectionJoueur.Add(new Joueur(21, PosteJoueur.BATTEUR, 150, new DateTime(1990, 10, 10), "Jamie", "Cudmore", 3));
            ObservableCollectionJoueur.Add(new Joueur(51, PosteJoueur.ATTRAPEUR, 100, new DateTime(1982, 10, 10), "Nathan", "Hines", 7));
            ObservableCollectionJoueur.Add(new Joueur(65, PosteJoueur.POURSUIVEUR, 5000, new DateTime(1990, 10, 10), "Fritz", "Lee", 8));
            ObservableCollectionJoueur.Add(new Joueur(15, PosteJoueur.POURSUIVEUR, 4000, new DateTime(1985, 10, 10), "Gherard", "Vosloo", 9));
            ObservableCollectionJoueur.Add(new Joueur(1, PosteJoueur.BATTEUR, 80, new DateTime(1989, 10, 10), "Julien", "Bardy", 10));
            ObservableCollectionJoueur.Add(new Joueur(1, PosteJoueur.BATTEUR, 100, new DateTime(1987, 10, 10), "Julien", "Bonnaire", 11));
            ObservableCollectionJoueur.Add(new Joueur(25, PosteJoueur.ATTRAPEUR, 600, new DateTime(1990, 12, 10), "Wesley", "Fofana", 12));


            return ObservableCollectionJoueur;
        }

        private ObservableCollection<Joueur> joueurToulon()
        {
            ObservableCollection<Joueur> ObservableCollectionJoueur = new ObservableCollection<Joueur>();

            ObservableCollectionJoueur.Add(new Joueur(1, PosteJoueur.GARDIEN, 0, new DateTime(1990, 10, 10), "Leigh", "Halfpenny", 1));
            ObservableCollectionJoueur.Add(new Joueur(5, PosteJoueur.BATTEUR, 24, new DateTime(1990, 10, 10), "Bakkies", "Botta", 4));
            ObservableCollectionJoueur.Add(new Joueur(8, PosteJoueur.ATTRAPEUR, 30, new DateTime(1990, 10, 10), "Bryan", "Habana", 5));
            ObservableCollectionJoueur.Add(new Joueur(7, PosteJoueur.ATTRAPEUR, 10, new DateTime(1986, 10, 10), "Ali", "Williams", 6));
            ObservableCollectionJoueur.Add(new Joueur(15, PosteJoueur.POURSUIVEUR, 4000, new DateTime(1985, 10, 10), "Fernandez", "Lobe", 9));

            return ObservableCollectionJoueur;
        }

        #endregion

        #region Creation Equipe
        private Equipe createASM()
        {
            return new Equipe(joueurASM().ToList(), "ASM CA", "France", 1);
        }

        private Equipe createRCT()
        {
            return new Equipe(joueurToulon().ToList(), "RCT", "France", 2);
        }
        #endregion

        #region Methodes "Bouchon"

        public static DalManager GetInstance()
        {
            if(instance == null)
                instance = new DalManager();

            return instance;
        }

        public ObservableCollection<Joueur> returnAllJoueurs() 
        {
            ObservableCollection<Joueur> ObservableCollectionJoueur = new ObservableCollection<Joueur>();
            ObservableCollectionJoueur.Add(new Joueur(1, PosteJoueur.GARDIEN, 0, new DateTime(1990, 10, 10), "Leigh", "Halfpenny", 1));
            ObservableCollectionJoueur.Add(new Joueur(42, PosteJoueur.GARDIEN, 10, new DateTime(1990, 10, 10), "Lee", "Byrne", 2));
            ObservableCollectionJoueur.Add(new Joueur(21, PosteJoueur.BATTEUR, 150, new DateTime(1990, 10, 10), "Jamie", "Cudmore", 3));
            ObservableCollectionJoueur.Add(new Joueur(5, PosteJoueur.BATTEUR, 24, new DateTime(1990, 10, 10), "Bakkies", "Botta", 4));
            ObservableCollectionJoueur.Add(new Joueur(8, PosteJoueur.ATTRAPEUR, 30, new DateTime(1990, 10, 10), "Bryan", "Habana", 5));
            ObservableCollectionJoueur.Add(new Joueur(7, PosteJoueur.ATTRAPEUR, 10, new DateTime(1986, 10, 10), "Ali", "Williams", 6));
            ObservableCollectionJoueur.Add(new Joueur(51, PosteJoueur.ATTRAPEUR, 100, new DateTime(1982, 10, 10), "Nathan", "Hines", 7));
            ObservableCollectionJoueur.Add(new Joueur(65, PosteJoueur.POURSUIVEUR, 5000, new DateTime(1990, 10, 10), "Fritz", "Lee", 8));
            ObservableCollectionJoueur.Add(new Joueur(15, PosteJoueur.POURSUIVEUR, 4000, new DateTime(1985, 10, 10), "Gherard", "Vosloo", 9));
            ObservableCollectionJoueur.Add(new Joueur(1, PosteJoueur.BATTEUR, 80, new DateTime(1989, 10, 10), "Julien", "Bardy", 10));
            ObservableCollectionJoueur.Add(new Joueur(1, PosteJoueur.BATTEUR, 100, new DateTime(1987, 10, 10), "Julien", "Bonnaire", 11));
            ObservableCollectionJoueur.Add(new Joueur(25, PosteJoueur.ATTRAPEUR, 600, new DateTime(1990, 12, 10), "Wesley", "Fofana", 12));


            return ObservableCollectionJoueur;
        }

        public ObservableCollection<Reservation> returnAllReservations()
        {
            ObservableCollection<Reservation> ObservableCollectionR = new ObservableCollection<Reservation>();
            Match match1 = new Match(2, new DateTime(2014, 5, 12), createASM(), createRCT(), 45.50, 50, 0, new Stade("rue Close Four", "Stade Marcel-Michelin", 18000, 0, 1), 1);
            Match match2 = new Match(2, new DateTime(2014, 5, 18), createRCT(), createASM(), 75.50, 10, 25, new Stade("toulon", "Stade Felix-Mayol", 18000, 0, 3), 2);

            ObservableCollectionR.Add(new Reservation(2, match1, 2, new Spectateur("El Fattake", "Abdessamad", "", "", new DateTime(1989,12,12), 1), 1));
            ObservableCollectionR.Add(new Reservation(2, match2, 3, new Spectateur("Le gouellec", "sylvain", "", "", new DateTime(1993, 10, 12), 2), 2));

            return ObservableCollectionR;
        }

        public ObservableCollection<Spectateur> returnAllSpectateurs()
        {
            ObservableCollection<Spectateur> ObservableCollectionS = new ObservableCollection<Spectateur>();
            ObservableCollectionS.Add(new Spectateur("El Fattake", "Abdessamad", "", "", new DateTime(1989, 12, 12), 1));
            ObservableCollectionS.Add(new Spectateur("TOTO", "TOTO", "", "", new DateTime(1989, 12, 12), 1));
            ObservableCollectionS.Add(new Spectateur("TOTO", "TITI", "", "", new DateTime(1989, 12, 12), 1));
            ObservableCollectionS.Add(new Spectateur("Le gouellec", "sylvain", "", "", new DateTime(1993, 10, 12), 2));

            return ObservableCollectionS;
        }

        public ObservableCollection<Equipe> returnAllEquipes()
        {
            ObservableCollection<Equipe> ObservableCollectionEquipe = new ObservableCollection<Equipe>();
            ObservableCollectionEquipe.Add(createASM());
            ObservableCollectionEquipe.Add(createRCT());

            return ObservableCollectionEquipe;
        }

        public ObservableCollection<Stade> returnAllStades()
        {
            ObservableCollection<Stade> ObservableCollectionStade = new ObservableCollection<Stade>();
            ObservableCollectionStade.Add(new Stade("rue Close Four", "Stade Marcel-Michelin", 18000, 0, 1));
            ObservableCollectionStade.Add(new Stade("toulouse", "Stade Ernest-Wallon", 18500, 0, 2));
            ObservableCollectionStade.Add(new Stade("toulon", "Stade Felix-Mayol", 18000, 0, 3));
            ObservableCollectionStade.Add(new Stade("castre", "Stade Pierre-Antoine", 14000, 0, 4));

            return ObservableCollectionStade;
        }

        public ObservableCollection<Match> returnAllMatches()
        {
            ObservableCollection<Match> ObservableCollectionMath = new ObservableCollection<Match>();
            ObservableCollectionMath.Add(new Match(5, new DateTime(2014, 5, 12), createASM(), createRCT(), 45.50, 50, 0, new Stade("rue Close Four", "Stade Marcel-Michelin", 18000, 0, 1), 1));
            ObservableCollectionMath.Add(new Match(5, new DateTime(2014, 5, 18), createRCT(), createASM(), 75.50, 10, 25, new Stade("toulon", "Stade Felix-Mayol", 18000, 0, 3), 2));
            return ObservableCollectionMath;
        }

        public ObservableCollection<Coupe> returnAllCoupes()
        {
            ObservableCollection<Coupe> ObservableCollectionCoupe = new ObservableCollection<Coupe>();
            ObservableCollectionCoupe.Add(new Coupe(1,"Coupe des nations",2010));
            ObservableCollectionCoupe.Add(new Coupe(2,"Coupe de France",2011));
            ObservableCollectionCoupe.Add(new Coupe(3,"Coupe des Quatre Maisons",2012));
            ObservableCollectionCoupe.Add(new Coupe(4,"Coupe du monde",2013));
            ObservableCollectionCoupe.Add(new Coupe(5,"Coupe d'Angleterre",2014));

            return ObservableCollectionCoupe;
        }

        #endregion
    }
}
